package spec

import "context"

//AckMode 表示生产者生产消息时的确认模式
//该模式关系到数据是否丢失
type AckMode int16

const (
	// 不等待broker同步完成的确认 该模式可靠性最低但性能最高
	WaitNone AckMode = 0
	// 等待leader成功收到数据并确认 若leader在数据还未复制到follower前就崩溃则丢失消息
	WaitLeader AckMode = 1
	// 在follower副本确认接收到数据后才算发送完成 具体需多少个follower确认取决于集群的min.insync.replicas配置项
	WaitAll AckMode = -1
)

//AORMode(auto.offset.reset) Kafka的自动偏移量重置方式
//同消费者组的消费者无初始偏移或当前偏移在服务器上不存在时消费者的消费行为
type AORMode int16

const (
	//从消费开始后产生的新消息开始消费
	Newest AORMode = 0
	//从最早的消息开始消费
	Earliest AORMode = 1
)

//SASLInfo 简单验证与安全层信息 用于生产者与消费者同Broker之间的安全验证
type SASLInfo struct {
	//用户名
	UserName string
	//密码（明文）
	Password string
}

//Msg 表示一个Kafka的数据消息
type Msg interface {
	//当前数据所属Topic
	Topic() string
	//当前数据所属Topic下的分区
	Partition() int32
	//当前数据的分区偏移量
	Offset() int64
	//实际数据内容
	Data() []byte
	GetKey() []byte
}

//Consumer 消息消费者
type Consumer interface {
	//Confirm 确认单笔消息及该消息之前的所有消息
	Confirm(msg Msg) error
	//ConfirmBatch 批量确认不同Topic与Partition的最后一笔消息
	ConfirmBatch(msgs []Msg) error
	//StartBlock 开始进行阻塞消费
	StartBlock(ctx context.Context)
	//Close 关闭消费者
	Close() (err error)
}

//Producer 消息生产者
type Producer interface {
	//同步生产消息
	SyncProduce(topic, key string, data interface{}) (n int, err error)

	//异步生产消息
	AsyncProduce(ctx context.Context, topic, key string, data interface{}) (n int, err error)

	//Close 关闭生产者
	Close() (err error)
}
